package com.pawernode.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;

/**
 * 消息服务类，负责发送消息到 RabbitMQ
 */
@Service
@Slf4j
public class MessageService{

    // 这就是模板方法设计模式
    @Resource
    private RabbitTemplate rabbitTemplate;

    /**
     * 初始化方法，设置 RabbitTemplate 的确认回调
     * 在容器启动的时候执行，相当于初始化作用
     */
    @PostConstruct
    public void init() {
        rabbitTemplate.setConfirmCallback(
                // Lambda 表达式
                (correlationData, ack, cause) -> {
                    log.info("关联的id为：{}", correlationData.getId() + "");
                    if (ack) {
                        log.info("消息发送成功到达交换机");
                        return;
                    }
                    // ack 为 false 表示没有到达交换机
                    log.error("消息发送失败，原因为：{}", cause);
                });
    }

    /**
     * 发送消息到 RabbitMQ
     */
    public void sendMsg() {
        // 创建消息
        Message message = MessageBuilder.withBody("hello rabbitmq".getBytes()).build();
        // 创建关联数据，用于确认消息是否发送成功
        CorrelationData correlationData = new CorrelationData();
        correlationData.setId("order_123456"); // 发送订单信息
        // 发送消息
        rabbitTemplate.convertAndSend("exchange.confirm.4", "info", message, correlationData);
        log.info("消息发送完毕，发送时间为：{}", new Date());
    }
}
